home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 32 / Mac Magazin and MacEasy Magazine CD - Issue 32.iso / Grafik & Text / OzTeX3.0 / Metafont / Inputs / cm / symbol.mf < prev    next >
Text File  |  1996-03-25  |  44KB  |  1,043 lines

  1. % This file defines the symbols of a \TeX\ math symbol font.
  2. % Character codes \0000--\0100 and \0133--\0177 are generated.
  3.  
  4. % (Improvements to the author's original characters were worked out in 1982
  5. % by Ronald F. Whitney and other members of
  6. % the American Mathematical Society.)
  7.  
  8. % Italic corrections have not been computed for most of these characters,
  9. % since they are generally not slanted.
  10.  
  11. minus=oct"000"; cdot=oct"001"; diamond=oct"005";
  12. plus_minus=oct"006"; o_plus=oct"010"; o_times=oct"012";
  13. eqv=oct"021"; leq=oct"024"; geq=oct"025";
  14. subset=oct"032"; superset=oct"033";
  15. left_arrow=oct"040"; right_arrow=oct"041";
  16. up_arrow=oct"042"; down_arrow=oct"043"; double_arrow=oct"044";
  17. infty=oct"061"; elt=oct"062";
  18. for_all=oct"070"; there_exists=oct"071"; false_that=oct"072";
  19. cup=oct"133"; cap=oct"134"; meet=oct"136"; join=oct"137";
  20. left_brace=oct"146"; right_brace=oct"147"; vertical=oct"152";
  21. backslash=oct"156"; integral=oct"163";
  22.  
  23. input sym;  % symbols common to other fonts
  24.  
  25. cmchar "Times operator";
  26. beginarithchar(oct"002"); pickup rule.nib;
  27. x1=good.x(1/sqrt2)[.5w,rt u]; y1=good.y(1/sqrt2)[math_axis,bot h];
  28. x2=x3=w-x1; x4=x1; .5[y1,y2]=.5[y3,y4]=math_axis; y2=y4;
  29. draw z1--z2; draw z3--z4;  % diagonals
  30. labels(1,2,3,4); endchar;
  31.  
  32. cmchar "Asterisk at the axis";
  33. beginchar(oct"003",9u#,v_center(x_height#));
  34. adjust_fit(0,0);
  35. numeric ast_flare; ast_flare=hround .7[thin_join,stem];
  36. x0=.5w; y0=h-.5x_height;
  37. for d=-150 step 60 until 150: z[d]=z0+.5dir d xscaled 7.5u yscaled x_height;
  38.  numeric theta; theta=angle(z[d]-z0);
  39.  fill z0+.5(0,-thin_join)rotated theta
  40.   ---z[d]+.5(-ast_flare,-ast_flare)rotated theta
  41.   ..z[d]..z[d]+.5(-ast_flare,ast_flare)rotated theta
  42.   ---z0+.5(0,thin_join)rotated theta--cycle; endfor  % diagonal at angle |d|
  43. labels(0,[-150],[-90],[-30],30,90,150); endchar;
  44.  
  45. cmchar "Elementary division operator";
  46. beginarithchar(oct"004"); pickup fine.nib; pickup rule.nib;
  47. numeric del; del=dot_size-currentbreadth;
  48. x3-.5del=good.x(.5w-.5del); center_on(x3);
  49. y3+.5del=good.y(math_axis+math_spread[.5x_height,.6x_height]+.5del);
  50. lft x1=hround u-eps; x2=w-x1; y1=y2=math_axis;
  51. draw z1--z2;  % bar
  52. pos3(dot_size,0); pos4(dot_size,90); z3=z4;
  53. pos5(dot_size,0); pos6(dot_size,90); z5=z6; x5=x3; .5[y3,y5]=math_axis;
  54. dot(3,4); dot(5,6);  % dots
  55. penlabels(1,2,3,4,5,6); endchar;
  56.  
  57. cmchar "Minus-or-plus sign";
  58. beginarithchar(oct"007"); pickup rule.nib;
  59. numeric shiftup; shiftup=-vround 1.5u;
  60. x1=x2=.5w; lft x3=lft x5=hround u-eps; x4=x6=w-x3;
  61. .5[y1,y2]=y3=y4=math_axis+shiftup; top y1=h+shiftup; y5=y6=y1;
  62. draw z1--z2;  % stem
  63. draw z3--z4;  % plus bar
  64. draw z5--z6;  % minus bar
  65. labels(1,2,3,4,5,6); endchar;
  66.  
  67. cmchar "Circle-minus operator";
  68. beginarithchar(oct"011"); pickup light_rule.nib; autorounded;
  69. lft x6=hround u; x2=w-x6; y2=math_axis; top y8=h;
  70. circle_points; draw_circle;  % circle
  71. draw z2--z6;  % bar
  72. labels(1,2,3,4,5,6,7,8); endchar;
  73.  
  74. cmchar "Circle-divide operator";
  75. beginarithchar(oct"013"); pickup light_rule.nib; autorounded;
  76. lft x6=hround u; x2=w-x6; y2=math_axis; top y8=h;
  77. circle_points; draw_circle;  % circle
  78. draw z1--z5;  % diagonal
  79. labels(1,2,3,4,5,6,7,8); endchar;
  80.  
  81. cmchar "Circle-dot operator";
  82. beginarithchar(oct"014"); pickup light_rule.nib; autorounded;
  83. lft x6=hround u; x2=w-x6; y2=math_axis; top y8=h;
  84. circle_points; draw_circle;  % circle
  85. fill fullcircle scaled(1.3dot_size+eps) shifted(.5[z4,z8]);  % dot
  86. labels(1,2,3,4,5,6,7,8); endchar;
  87.  
  88. cmchar "Circle for copyright, etc.";
  89. beginchar(oct"015",18u#,asc_height#,desc_depth#); autorounded;
  90. adjust_fit(if monospace:-3u#,-3u# else: 0,0 fi); pickup rule.nib;
  91. lft x6=hround u; x2=w-x6; top y8=h+o; bot y4=-d-o;
  92. circle_points; draw_circle;  % circle
  93. labels(1,2,3,4,5,6,7,8); endchar;
  94.  
  95. cmchar "Circle operator";
  96. beginchar(oct"016",9u#,v_center(7u#));
  97. adjust_fit(0,0); pickup rule.nib; autorounded;
  98. lft x6=hround u; x2=w-x6; top y8=h; y2=math_axis;
  99. circle_points; draw_circle;  % circle
  100. labels(1,2,3,4,5,6,7,8); endchar;
  101.  
  102. cmchar "Bullet";
  103. beginchar(oct"017",9u#,v_center(7u#));
  104. adjust_fit(0,0); pickup rule.nib; autorounded;
  105. lft x6=hround u; x2=w-x6; top y8=h; y2=math_axis; circle_points;
  106. filldraw z8{right}...z1{z2-z8}...z2{down}...z3{z4-z2}...z4{left}
  107.   ...z5{z6-z4}...z6{up}...z7{z8-z6}...cycle;  % circle and interior
  108. labels(1,2,3,4,5,6,7,8); endchar;
  109.  
  110. cmchar "Hardy's asymptotic equivalence sign";
  111. compute_spread(.45x_height#,.55x_height#);
  112. beginchar(oct"020",14u#,v_center(2spread#+rule_thickness#));
  113. adjust_fit(0,0); pickup rule.nib; autorounded;
  114. lft x1=hround u-eps; x3=x1; x2=x4=w-x1; x5=x6=.5w;
  115. y1=y2=good.y h; y3=y4; .5[y1,y3]=.5[y5,y6]=math_axis;
  116. y5=good.y .3[y1,y3];
  117. draw z1{x5-x1,2(y5-y1)}...z5{right}...z2{x2-x5,2(y2-y5)};  % upper bar
  118. draw z3{x6-x3,2(y6-y3)}...z6{right}...z4{x4-x6,2(y4-y6)};  % lower bar
  119. labels(1,2,3,4); endchar;
  120.  
  121. cmchar "Subset or equal to sign";
  122. compute_spread(.45x_height#,.55x_height#);
  123. spread#':=spread#; spread':=spread; % the spread of `$=$'
  124. compute_spread(5/4x_height#,3/2x_height#);
  125. beginchar(oct"022",14u#,v_center(spread#'+spread#+rule_thickness#));
  126. adjust_fit(0,0); pickup rule.nib; autorounded;
  127. lft x2=hround 1.5u-eps; x1=x3=w-x2;
  128. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  129. x4=x5=.5w; y4=y1; y5=y3;
  130. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  131. x8=x1; lft x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % lower bar
  132. labels(1,2,3,4,5,8,9); endchar;
  133.  
  134. cmchar "Superset or equal to sign";
  135. compute_spread(.45x_height#,.55x_height#);
  136. spread#':=spread#; spread':=spread; % the spread of `$=$'
  137. compute_spread(5/4x_height#,3/2x_height#);
  138. beginchar(oct"023",14u#,v_center(spread#'+spread#+rule_thickness#));
  139. adjust_fit(0,0); pickup rule.nib; autorounded;
  140. lft x1=hround 1.5u-eps; x2=w-x1; x3=x1;
  141. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  142. x4=x5=.5w; y4=y1; y5=y3;
  143. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  144. x8=x1; rt x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % lower bar
  145. labels(1,2,3,4,5,8,9); endchar;
  146.  
  147. cmchar "Precedes or equals sign";
  148. compute_spread(.45x_height#,.55x_height#);
  149. spread#':=spread#; spread':=spread; % the spread of `$=$'
  150. compute_spread(5/4x_height#,3/2x_height#);
  151. beginchar(oct"026",14u#,v_center(spread#'+spread#+rule_thickness#));
  152. adjust_fit(0,0); pickup rule.nib; autorounded;
  153. lft x2=hround 1.5u-eps; x1=x3=w-x2;
  154. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  155. draw z1{-u,-spread}...{left}z2;  % upper diagonal
  156. draw z3{-u,spread}...{left}z2;  % lower diagonal
  157. x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % bar
  158. labels(1,2,3,8,9); endchar;
  159.  
  160. cmchar "Follows or equals sign";
  161. compute_spread(.45x_height#,.55x_height#);
  162. spread#':=spread#; spread':=spread; % the spread of `$=$'
  163. compute_spread(5/4x_height#,3/2x_height#);
  164. beginchar(oct"027",14u#,v_center(spread#'+spread#+rule_thickness#));
  165. adjust_fit(0,0); pickup rule.nib; autorounded;
  166. lft x1=hround 1.5u-eps; x2=w-x1; x3=x1;
  167. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  168. draw z1{u,-spread}...{right}z2;  % upper diagonal
  169. draw z3{u,spread}...{right}z2;  % lower diagonal
  170. x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % bar
  171. labels(1,2,3,8,9); endchar;
  172.  
  173. cmchar "Similarity sign";
  174. compute_spread(.45x_height#,.55x_height#);
  175. beginchar(oct"030",14u#,v_center(spread#+rule_thickness#));
  176. adjust_fit(0,0);
  177. pickup pencircle xscaled .7rule_thickness yscaled 1.4rule_thickness;
  178. if vair#>.8curve#: pickup rule.nib; autorounded; fi % monoline
  179. lft x1=hround u; x2=4u; x3=w-x2; x4=w-x1;
  180. bot y1=bot y3=-d; top y2=top y4=h;
  181. draw z1{up}...z2{right}..{right}z3...{up}z4;  % stroke
  182. labels(1,2,3,4); endchar;
  183.  
  184. cmchar "Approximate equality sign";
  185. compute_spread(.45x_height#,.55x_height#);
  186. spread#':=spread#; spread':=spread; % the spread of `$=$'
  187. compute_spread(.54x_height#,.66x_height#);
  188. beginchar(oct"031",14u#,v_center(spread#'+spread#+rule_thickness#));
  189. adjust_fit(0,0);
  190. pickup pencircle xscaled .7rule_thickness yscaled 1.4rule_thickness;
  191. if vair#>.8curve#: pickup rule.nib; autorounded; fi % monoline
  192. lft x1=hround u; x2=4u; x3=w-x2; x4=w-x1;
  193. y1=y3; top y2=top y4=h; top y2-bot y1=spread';
  194. draw z1{up}...z2{right}..{right}z3...{up}z4;  % upper stroke
  195. z1-z5=z2-z6=z3-z7=z4-z8=(0,spread);
  196. draw z5{up}...z6{right}..{right}z7...{up}z8;  % lower stroke
  197. labels(1,2,3,4,5,6,7,8); endchar;
  198.  
  199. cmchar "Much less sign";
  200. compute_spread(5/4x_height#,3/2x_height#);
  201. beginchar(oct"034",18u#,v_center(spread#+rule_thickness#));
  202. adjust_fit(if monospace:-u#,-u# else: 0,0 fi); pickup rule.nib;
  203. lft x2=hround u-epsilon; x1=x3=hround 12.5u-x2;
  204. y1-y3=ceiling 1.1spread; y2=.5[y1,y3]=math_axis;
  205. draw z1--z2--z3;  % left diagonals
  206. z4-z1=z5-z2=z6-z3; x4=w-x2; y4=y1;
  207. draw z4--z5--z6;  % right diagonals
  208. labels(1,2,3,4,5,6); endchar;
  209.  
  210. cmchar "Much greater sign";
  211. compute_spread(5/4x_height#,3/2x_height#);
  212. beginchar(oct"035",18u#,v_center(spread#+rule_thickness#));
  213. adjust_fit(if monospace:-u#,-u# else: 0,0 fi); pickup rule.nib;
  214. lft x1=hround u-epsilon; x2=hround 12.5u-x1; x3=x1;
  215. y1-y3=ceiling 1.1spread; y2=.5[y1,y3]=math_axis;
  216. draw z1--z2--z3;  % left diagonals
  217. z4-z1=z5-z2=z6-z3; x4=w-x2; y4=y1;
  218. draw z4--z5--z6;  % right diagonals
  219. labels(1,2,3,4,5,6); endchar;
  220.  
  221. cmchar "Precedes sign";
  222. compute_spread(5/4x_height#,3/2x_height#);
  223. beginchar(oct"036",14u#,v_center(spread#+rule_thickness#));
  224. adjust_fit(0,0); pickup rule.nib; autorounded;
  225. lft x2=hround 1.5u-epsilon; x1=x3=w-x2;
  226. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  227. draw z1{-u,-spread}...{left}z2;  % upper diagonal
  228. draw z3{-u,spread}...{left}z2;  % lower diagonal
  229. labels(1,2,3); endchar;
  230.  
  231. cmchar "Follows sign";
  232. compute_spread(5/4x_height#,3/2x_height#);
  233. beginchar(oct"037",14u#,v_center(spread#+rule_thickness#));
  234. adjust_fit(0,0); pickup rule.nib; autorounded;
  235. lft x1=hround 1.5u-epsilon; x2=w-x1; x3=x1;
  236. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  237. draw z1{u,-spread}...{right}z2;  % upper diagonal
  238. draw z3{u,spread}...{right}z2;  % lower diagonal
  239. labels(1,2,3); endchar;
  240.  
  241. cmchar "Northeast arrow";
  242. beginchar(oct"045",18u#,asc_height#,asc_depth#);
  243. adjust_fit(0,0); pickup crisp.nib;
  244. x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  245. y1-.5rule_thickness=-d; top y0=h;
  246. numeric theta,delta; theta=angle(z0-z1); delta=3u++.24asc_height;
  247. if abs(theta-45)<2.5: theta:=45; y1:=y0+x1-x0; fi % near-45$^\circ$ angle
  248. pos1(rule_thickness,90+theta); pos2(rule_thickness,90+theta);
  249. pos3(rule_thickness,theta); pos4(rule_thickness,theta);
  250. z3-z0=(-4u,.36asc_height) rotated theta;
  251. z4-z0=(-4u,-.36asc_height) rotated theta;
  252. pos5(rule_thickness,-90); z5l=z0; pos6(rule_thickness,-180); z6l=z0;
  253. z9=.2[.5[z3,z4],z0];
  254. numeric t; path p; p=z4l{z9-z4}..z6r;
  255. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  256. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  257.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  258.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  259. penlabels(0,1,2,3,4,5,6,9); endchar;
  260.  
  261. cmchar "Southeast arrow";
  262. beginchar(oct"046",18u#,asc_height#,asc_depth#);
  263. adjust_fit(0,0); pickup crisp.nib;
  264. x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  265. y1+.5rule_thickness=h; bot y0=-d;
  266. numeric theta,delta; theta=angle(z0-z1); delta=3u++.24asc_height;
  267. if abs(theta+45)<2.5: theta:=-45; y1:=y0+x0-x1; fi % near-45$^\circ$ angle
  268. pos1(rule_thickness,90+theta); pos2(rule_thickness,90+theta);
  269. pos3(rule_thickness,theta); pos4(rule_thickness,theta);
  270. z3-z0=(-4u,.36asc_height) rotated theta;
  271. z4-z0=(-4u,-.36asc_height) rotated theta;
  272. pos5(rule_thickness,180); z5l=z0; pos6(rule_thickness,90); z6l=z0;
  273. z9=.2[.5[z3,z4],z0];
  274. numeric t; path p; p=z4l{z9-z4}..z6r;
  275. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  276. filldraw z0..{z4-z9}z4r
  277.  --subpath (0,t) of\\(z4l{z9-z4}..z6r)
  278.  --z2l---z1l..z1r---z2r
  279.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  280.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  281. penlabels(0,1,2,3,4,5,6,9); endchar;
  282.  
  283. cmchar "Similar or equal sign";
  284. compute_spread(.45x_height#,.55x_height#);
  285. beginchar(oct"047",14u#,v_center(2spread#+rule_thickness#));
  286. adjust_fit(0,0);
  287. pickup pencircle xscaled .7rule_thickness yscaled 1.4rule_thickness;
  288. if vair#>.8curve#: pickup rule.nib; autorounded; fi % monoline
  289. lft x1=hround u; x2=4u; x3=w-x2; x4=w-x1;
  290. bot y1=bot y3=floor math_axis; top y2=top y4=h;
  291. draw z1{up}...z2{right}..{right}z3...{up}z4;  % stroke
  292. pickup rule.nib; lft x5=hround u-eps; x6=w-x5; y5=y6=math_axis-spread;
  293. draw z5--z6;  % bar
  294. labels(1,2,3,4,5,6); endchar;
  295.  
  296. cmchar "Double leftward arrow";
  297. compute_spread(.45x_height#,.55x_height#);
  298. beginchar(oct"050",18u#,v_center(spread#+rule_thickness#));
  299. adjust_fit(0,0); pickup rule.nib;
  300. lft x7=hround u-eps; x8=x7; x1=x2=w-x7;
  301. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  302. draw z1--z7; draw z2--z8;  % bars
  303. pickup crisp.nib; lft x0=hround u-eps; y0=good.y math_axis;
  304. pos3(rule_thickness,0); pos4(rule_thickness,0);
  305. y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+6u+eps;
  306. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  307. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  308. z9=.381966[.5[z3,z4],z0];
  309. erase filldraw z0..{z3-z9}z3--(0,y3)
  310.  --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
  311. numeric t; path p; p=z4r{z9-z4}..z6r;
  312. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  313. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  314.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
  315. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  316.  
  317. cmchar "Double rightward arrow";
  318. compute_spread(.45x_height#,.55x_height#);
  319. beginchar(oct"051",18u#,v_center(spread#+rule_thickness#));
  320. adjust_fit(0,0); pickup rule.nib;
  321. lft x1=hround u-eps; x2=x1; x7=x8=w-x1;
  322. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  323. draw z1--z7; draw z2--z8;  % bars
  324. pickup crisp.nib; rt x0=hround(w-u)+eps; y0=good.y math_axis;
  325. pos3(rule_thickness,0); pos4(rule_thickness,0);
  326. y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0-6u-eps;
  327. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  328. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  329. z9=.381966[.5[z3,z4],z0];
  330. erase filldraw z0..{z3-z9}z3--(w,y3)
  331.  --(w,y4)--z4{z9-z4}..z0 & cycle;  % erase excess
  332. numeric t; path p; p=z4l{z9-z4}..z6r;
  333. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  334. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  335.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
  336. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  337.  
  338. cmchar "Double upward arrow";
  339. beginchar(oct"052",11u#,asc_height#,asc_depth#);
  340. adjust_fit(0,0); pickup rule.nib;
  341. compute_spread(.45x_height#,.55x_height#);
  342. bot y1=bot y2=-d-eps; top y7=h; y8=y7;
  343. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  344. draw z1--z7; draw z2--z8;  % bars
  345. pickup crisp.nib; top y0=h+eps; x0=good.x .5w;
  346. pos3(rule_thickness,90); pos4(rule_thickness,90);
  347. x2-x3=x4-x1=3u+eps; y3=y4=y0-.48asc_height-eps;
  348. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  349. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  350. z9=.381966[.5[z3,z4],z0];
  351. erase filldraw z0..{z3-z9}z3--(x3,h)
  352.  --(x4,h)--z4{z9-z4}..z0 & cycle;  % erase excess
  353. numeric t; path p; p=z4l{z9-z4}..z6r;
  354. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  355. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  356.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)--z3r{z9-z3}..z0 & cycle;  % arrowhead
  357. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  358.  
  359. cmchar "Double downward arrow";
  360. beginchar(oct"053",11u#,asc_height#,asc_depth#);
  361. adjust_fit(0,0); pickup rule.nib;
  362. compute_spread(.45x_height#,.55x_height#);
  363. top y1=top y2=h+eps; bot y7=-d; y8=y7;
  364. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  365. draw z1--z7; draw z2--z8;  % bars
  366. pickup crisp.nib; bot y0=-d-eps; x0=good.x .5w;
  367. pos3(rule_thickness,90); pos4(rule_thickness,90);
  368. x2-x3=x4-x1=3u+eps; y3=y4=y0+.48asc_height-eps;
  369. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  370. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  371. z9=.381966[.5[z3,z4],z0];
  372. erase filldraw z0..{z3-z9}z3--(x3,-d)
  373.  --(x4,-d)--z4{z9-z4}..z0 & cycle;  % erase excess
  374. numeric t; path p; p=z4r{z9-z4}..z6r;
  375. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  376. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  377.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)--z3l{z9-z3}..z0 & cycle;  % arrowhead
  378. penlabels(0,1,2,3,4,5,6,7,8,9); endchar;
  379.  
  380. cmchar "Double left-and-right arrow";
  381. compute_spread(.45x_height#,.55x_height#);
  382. beginchar(oct"054",18u#,v_center(spread#+rule_thickness#));
  383. adjust_fit(if monospace: -u#,-u# else: 0,0 fi); pickup rule.nib;
  384. lft x7=hround u-eps; x8=x7; x1=x2=w-x7;
  385. y1=y7; y2=y8; y1-y2=spread; .5[y1,y2]=math_axis;
  386. draw z1--z7; draw z2--z8;  % bars
  387. pickup crisp.nib; lft x0=hround u-o; y0=good.y math_axis;
  388. pos3(rule_thickness,0); pos4(rule_thickness,0);
  389. y3-y1=y2-y4=.24asc_height+eps; x3=x4=x0+5u+eps;
  390. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  391. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  392. z9=.381966[.5[z3,z4],z0];
  393. erase filldraw z0..{z3-z9}z3--(0,y3)
  394.  --(0,y4)--z4{z9-z4}..z0 & cycle;  % erase excess at left
  395. numeric t; path p; p=z4r{z9-z4}..z6r;
  396. t=xpart(p intersectiontimes((0,y0)--(w,y0)));
  397. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  398.  --subpath (t,0) of\\(z3r{z9-z3}..z5r)
  399.  --z3l{z9-z3}..z0 & cycle;  % left arrowhead
  400. rt x10=hround(w-u)+o; y10=good.y math_axis;
  401. pos13(rule_thickness,0); pos14(rule_thickness,0);
  402. y13=y3; y14=y4; x13=x14=x10-5u-eps;
  403. pos15(rule_thickness,angle(z14-z10)); z15l=z10;
  404. pos16(rule_thickness,angle(z13-z10)); z16l=z10;
  405. z19=.381966[.5[z13,z14],z10];
  406. erase filldraw z10..{z13-z19}z13--(w,y13)
  407.  --(w,y14)--z14{z19-z14}..z10 & cycle;  % erase excess at right
  408. numeric t; path p; p=z14l{z19-z14}..z16r;
  409. t=xpart(p intersectiontimes((0,y10)--(w,y10)));
  410. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  411.  --subpath (t,0) of\\(z13l{z19-z13}..z15r)
  412.  --z13r{z19-z13}..z10 & cycle; % right arrowhead
  413. penlabels(0,1,2,3,4,5,6,7,8,9,10,13,14,15,16,19); endchar;
  414.  
  415. cmchar "Northwest arrow";
  416. beginchar(oct"055",18u#,asc_height#,asc_depth#);
  417. adjust_fit(0,0); pickup crisp.nib;
  418. x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  419. y1-.5rule_thickness=-d; top y0=h;
  420. numeric theta,delta; theta=angle(z1-z0); delta=3u++.24asc_height;
  421. if abs(theta+45)<2.5: theta:=-45; y1:=y0+x0-x1; fi % near-45$^\circ$ angle
  422. pos1(rule_thickness,-90+theta); pos2(rule_thickness,-90+theta);
  423. pos3(rule_thickness,-180+theta); pos4(rule_thickness,-180+theta);
  424. z4-z0=(4u,.36asc_height) rotated theta;
  425. z3-z0=(4u,-.36asc_height) rotated theta;
  426. pos5(rule_thickness,0); z5l=z0; pos6(rule_thickness,-90); z6l=z0;
  427. z9=.2[.5[z3,z4],z0];
  428. numeric t; path p; p=z4l{z9-z4}..z6r;
  429. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  430. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  431.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  432.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  433. penlabels(0,1,2,3,4,5,6,9); endchar;
  434.  
  435. cmchar "Southwest arrow";
  436. beginchar(oct"056",18u#,asc_height#,asc_depth#);
  437. adjust_fit(0,0); pickup crisp.nib;
  438. x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  439. y1+.5rule_thickness=h; bot y0=-d;
  440. numeric theta,delta; theta=angle(z1-z0); delta=3u++.24asc_height;
  441. if abs(theta-45)<2.5: theta:=45; y1:=y0+x1-x0; fi % near-45$^\circ$ angle
  442. pos1(rule_thickness,-90+theta); pos2(rule_thickness,-90+theta);
  443. pos3(rule_thickness,-180+theta); pos4(rule_thickness,-180+theta);
  444. z4-z0=(4u,.36asc_height) rotated theta;
  445. z3-z0=(4u,-.36asc_height) rotated theta;
  446. pos5(rule_thickness,90); z5l=z0; pos6(rule_thickness,0); z6l=z0;
  447. z9=.2[.5[z3,z4],z0];
  448. numeric t; path p; p=z4l{z9-z4}..z6r;
  449. t=xpart(p intersectiontimes (z1l--(z1l+2(z0-z1)))); z2l=point t of p;
  450. filldraw z0..{z4-z9}z4r
  451.  --subpath (0,t) of\\(z4l{z9-z4}..z6r)
  452.  --z2l---z1l..z1r---z2r
  453.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  454.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  455. penlabels(0,1,2,3,4,5,6,9); endchar;
  456.  
  457. cmchar "Proportionality sign";
  458. beginchar(oct"057",16.5u#,x_height#,0);
  459. italcorr x_height#*slant-.5u#;
  460. adjust_fit(0,-2.5u#); pickup fine.nib;
  461. numeric theta,phi; phi=angle(3u,h); theta=angle(5u,-h);
  462. pos1(vair,180); pos2(.5[vair,stem],90+.5theta); pos3(stem,90+theta);
  463. pos4(stem,90+theta); pos5(.5[vair,stem],90+.5theta);
  464. pos6(vair,180); pos7(.2[vair,stem],270+.5phi);
  465. pos8(.3[vair,stem],270+phi); pos9(.2[vair,stem],270+.5phi);
  466. lft x1r=w-rt x6l=hround u; x2=x9=.4[x1,x8]; x5=x7=.6[x8,x6];
  467. if monospace: x2l:=x2r; x5r:=x5l; x7r:=x7l; x9l:=x9r; fi
  468. y1=y6=.5h; top y2r=top y7l=h+oo; bot y5l=bot y9r=-oo;
  469. x8=.5[x3,x4]=.5w; y8=.5[y3,y4]=.5h;
  470. y3-y4=h/3; z3-z4=whatever*dir theta;
  471. filldraw stroke z1e{up}...z2e{right}...z3e---z4e...z5e{right}...z6e{up}
  472.  ...z7e{left}...{-dir phi}z8e...{left}z9e...z1e{up}; % `infinity' bowls
  473. erase fill (w-3.5u,h+o)--(w,h+o)
  474.  --(w,-o)--(w-3.5u,-o)--cycle; % erase excess
  475. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  476.  
  477. cmchar "Prime symbol (intended as superscript only)";
  478. beginchar(oct"060",3u#+max(1.75u#,curve#+2(curve#-stem#)),
  479.  .8asc_height#,0);
  480. adjust_fit(0,0); pickup fine.nib;
  481. numeric light_stem,heavy_stem;
  482. light_stem=hround .5[vair,stem]; heavy_stem=hround(bold+2dw);
  483. x1+.5heavy_stem=hround(w-.25u); y1+.5heavy_stem=h;
  484. x2-.5light_stem=hround .5u; y2=1/12asc_height;
  485. numeric theta; theta=angle(z1-z2)-90;
  486. pos1(heavy_stem,theta); pos2(light_stem,theta);
  487. filldraw circ_stroke z1e--z2e;  % diagonal
  488. penlabels(1,2); endchar;
  489.  
  490. cmchar "Ownership sign";
  491. compute_spread(5/4x_height#,3/2x_height#);
  492. beginchar(oct"063",12u#,v_center(spread#+rule_thickness#));
  493. adjust_fit(0,0); pickup rule.nib; autorounded;
  494. lft x1=hround 1.5u-eps; x1=x3=x6=w-x2;
  495. y1-y3=spread; y2=y6=.5[y1,y3]=math_axis;
  496. x4=x5=.5w-u; y4=y1; y5=y3;
  497. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  498. draw z2--z6;  % middle bar
  499. labels(1,2,3,4,5,6); endchar;
  500.  
  501. cmchar "Large triangle";
  502. beginchar(oct"064",16u#,asc_height#,desc_depth#);
  503. adjust_fit(0,0); pickup rule.nib;
  504. bot y1=0; y2=y1; top y3=h+o;
  505. .5[x1,x2]=x3=good.x .5w; center_on(x3); lft x1=hround(.5w-u*sqrt48);
  506. draw z1--z2--z3--cycle;  % stroke
  507. labels(1,2,3); endchar;
  508.  
  509. cmchar "Large inverted triangle";
  510. beginchar(oct"065",16u#,asc_height#,desc_depth#);
  511. adjust_fit(0,0); pickup rule.nib;
  512. top y1=h-d; y2=y1; bot y3=-d-o;
  513. .5[x1,x2]=x3=good.x .5w; center_on(x3); lft x1=hround(.5w-u*sqrt48);
  514. draw z1--z2--z3--cycle;  % stroke
  515. labels(1,2,3); endchar;
  516.  
  517. cmchar "Zero-width slash to negate a relation";
  518. beginchar(oct"066",14u#,asc_height#,asc_depth#);
  519. adjust_fit(0,0); pickup rule.nib;
  520. rt x5=hround(w-2.5u)-eps; lft x6=hround 2.5u+eps;
  521. top y5=h+o; .5[y5,y6]=math_axis;
  522. draw z5--z6;  % diagonal
  523. labels(5,6); zero_width; endchar;
  524.  
  525. cmchar "Maps-to relation";
  526. compute_spread(.45x_height#,.55x_height#);
  527. beginchar(oct"067",14u#,v_center(spread#+rule_thickness#));
  528. % this character should be followed immediately by minus or rightarrow
  529. adjust_fit(0,0); pickup rule.nib;
  530. lft x1=hround u; x2=x1+.5u; x3=x4=x1;
  531. y1=y2=math_axis; y1-y3=y4-y1=.24asc_height+eps;
  532. draw z3--z4;  % stem
  533. draw z1--z2;  % bar stub
  534. labels(1,2,3,4); zero_width; endchar;
  535.  
  536. cmchar "Empty set symbol";
  537. beginchar(oct"073",9u#,body_height#,body_height#-asc_height#);
  538. adjust_fit(0,0);
  539. penpos1(vair,90); penpos3(vair,-90); penpos2(stem,180); penpos4(stem,0);
  540. if not monospace: interim superness:=sqrt(more_super*hein_super); fi
  541. x2r=hround max(.7u,1.45u-.5stem);
  542. x4r=w-x2r; x1=x3=.5w; y1r=asc_height+o; y3r=-o;
  543. y2=y4=.5asc_height-vair_corr; y2l:=y4l:=.52asc_height;
  544. penstroke pulled_arc.e(1,2) & pulled_arc.e(2,3)
  545.  & pulled_arc.e(3,4) & pulled_arc.e(4,1) & cycle;  % bowl
  546. pickup rule.nib; lft x6=hround 2u-eps; x5=w-x6; top y5=h+o; bot y6=-d-o;
  547. draw z5--z6;  % diagonal
  548. penlabels(1,2,3,4,5,6); endchar;
  549.  
  550. cmchar "Uppercase Fraktur R";
  551. beginchar(oct"074",13u#,asc_height#,0);
  552. adjust_fit(0,0); pickup fine.nib;
  553. pos1(hair,0); pos2(vair,90); pos3(1/6[hair,stem],190);
  554. pos4(1/4[hair,stem],210); pos5(1/8[hair,stem],190);
  555. pos6(vair,90); pos7(cap_stem,0); pos8(cap_stem,0);
  556. pos9(vair,-90); pos10(hair,-135); pos11(hair,-135);
  557. pos12(vair,135); pos13(vair,135);
  558. lft x1l=lft x5r=hround u; x2=.4[x1,x3]; rt x3l=hround 3.5u; x4=.6[x3,x5];
  559. x6=3u; lft x7=hround(6u-.5cap_stem); x8=x7;
  560. x9=3.5u; x10=5/3u; x11=4/3u; x12=u; x13=2u;
  561. y1=.47h; bot y2l=vround.35h; y3=1/3[y2,y6]; y5=3/4[y2,y6]; y4=.6[y3,y5];
  562. top y6r=h+oo; y7=.64h; y8=.57y7; bot y9r=-o;
  563. y10=1/6y7; y12=1/5y7; y13=1/4y7;
  564. z11-z10=whatever*(z13-z12) rotated 90;
  565. filldraw stroke z1e{down}...z2e{right}...z3e{up}..z4e..z5e{up}
  566.  ...pulled_arc.e(6,7)..pulled_arc.e(8,9)
  567.  ...z10e---z11e;  % flourish and left stem
  568. filldraw stroke z12e--z13e;  % cross
  569. pos20(cap_bar,180); pos21(cap_bar,90);
  570. x20=x7; y20=.75h; rt x21=hround(w-3.5u+.5cap_stem); top y21r=h+o;
  571. filldraw stroke z20e{up}...{right}z21e;  % top of bowl
  572. rt x22r=hround(w-.1u); y22r=good.y .64h;
  573. numeric theta; theta=angle(z21r-z22r);
  574. pos22(cap_stem,theta-90); pos23(cap_bar,theta); z22l=z23l;
  575. path p; p=z20{up}...(z21--(w,y21));
  576. z=p intersectionpoint(z22l--z22l+(h,0) rotated theta);
  577. filldraw z--z21r--z22r--z22l--cycle;  % diagonal of bowl
  578. pos24(cap_bar,90); pos25(cap_bar,90); x24=w-4u; x25=x7;
  579. y24=y25; top y24r=vround(.52h+.5cap_bar);
  580. filldraw stroke z23e{dir(theta+90)}...z24e---z25e;  % bottom of bowl
  581. pos26(cap_stem,0); pos27(cap_stem,0); pos28(cap_stem,0);
  582. x26=x24; x27=x26+.25u; x28l=w-2.5u; y26=y24r; y27=1/3y26; bot y28=-o;
  583. filldraw stroke z26e--z27e...{right}z28e;  % lower diagonal
  584. pos29(cap_bar,0); pos30(cap_bar,-30); z29l=z28l;
  585. x30r=good.x(w-.5u); y30r=good.y .09h;
  586. erase filldraw z29r--z28r--z30r--cycle;  % erase excess
  587. filldraw stroke z29e--z30e;  % serif of lower diagonal
  588. %% \begingroup\thinmuskip=3mu
  589. penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,20,21,22,23,24,25,26,27,28,29,30);
  590. %% \endgroup
  591. endchar;
  592.  
  593. cmchar "Uppercase Fraktur I";
  594. beginchar(oct"075",13u#,asc_height#,0);
  595. adjust_fit(0,0); pickup fine.nib;
  596. pos1(vair,270); pos2(cap_hair,180); pos3(vair,90);
  597. pos4(cap_stem,0); pos5(vair,90); pos6(cap_hair,180);
  598. x1=5u; lft x2r=hround u; x3=.5[x2,x4l]; x4r=x5-.75u;
  599. x5=.5[x4l,x6l]; rt x6l=hround(w-.5u);
  600. top y1l=vround.5h; y2=.5[y1,y3]; top y3r=h+oo;
  601. y4=.2[y5,y3]; y6=.3[y5,y3]; bot y5l=ceiling(1/6[x_height,h]);
  602. filldraw stroke z1e{left}...z2e{up}...z3e{right}
  603.  ..z4e..z5e{right}...{up}z6e;  % upper stroke
  604. pos7(vair,90); pos8(cap_stem,0); pos9(cap_stem,0);
  605. lft x7=hround u; z7r=z8l; x9=.5w+u; y8=good.y .25h; bot y9=-oo;
  606. filldraw z8l---z8r..{right}z9r+(0,eps)
  607.  --z9r---z9l..{left}z7l--cycle;  % lower left stroke
  608. pos10(cap_stem,0); pos11(cap_stem,0); pos12(vair,-90); pos13(cap_hair,-180);
  609. x10=w-2.5u; x11r=x12-u; x12=x5; x13=x6;
  610. y10=1/3y12; y11=3/4y12; top y12l=x_height; y13=4/5y12;
  611. filldraw z9l+(0,eps){right}...{up}z10l
  612.  --z10r{down}...z9r---z9l--cycle;  % lower link
  613. filldraw stroke z10e{up}...z11e{up}
  614.  ...z12e{right}...{down}z13e;  % lower right stroke
  615. penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13); endchar;
  616.  
  617. cmchar "Lattice top";
  618. beginchar(oct"076",14u#,asc_height#,0);
  619. adjust_fit(0,0); pickup rule.nib;
  620. x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3;
  621. bot y1=0; y2-y1=x4-x3;
  622. if top y2>h: y2:=bot h; fi
  623. y3=y4=y2;
  624. draw z1--z2;  % stem
  625. draw z3--z4;  % bar
  626. labels(1,2,3,4); endchar;
  627.  
  628. cmchar "Perpendicular sign or lattice bottom";
  629. beginchar(oct"077",14u#,asc_height#,0);
  630. adjust_fit(0,0); pickup rule.nib;
  631. x1=x2=good.x .5w; center_on(x1); lft x3=hround u; x4=w-x3;
  632. bot y1=0; y2-y1=x4-x3;
  633. if top y2>h: y2:=bot h; fi
  634. y3=y4=y1;
  635. draw z1--z2;  % stem
  636. draw z3--z4;  % bar
  637. labels(1,2,3,4); endchar;
  638.  
  639. cmchar "Hebrew letter aleph";
  640. beginchar(oct"100",11u#,asc_height#,0);
  641. adjust_fit(0,0); pickup fine.nib;
  642. pos1(cap_stem,75); pos2(cap_stem,90); pos3(cap_stem,90); pos4(cap_stem,75);
  643. lft x1l=hround u-eps; x2=2.5u=w-x3; rt x4r=hround(w-u)+eps;
  644. top y1r=h; bot y4l=0; z2=whatever[z1l,z4r]; z3=whatever[z1l,z4r];
  645. filldraw z1r{4(x1l-x1r),y1l-y1r}...{down}z1l...z2l
  646.  ---z3l...{down}z4l{4(x4r-x4l),y4r-y4l}...{up}z4r...z3r
  647.  ---z2r...{up}cycle; % long diagonal
  648. pos5(cap_stem,75); pos6(cap_stem,90); pos7(cap_stem,75);
  649. lft x5l=hround(w-4u)-eps; x6=.5[x5,x7]; x7=x4;
  650. y5=y1; bot y7l=x_height-o; z6=whatever[z5l,z7r];
  651. filldraw z5r{4(x5l-x5r),y5l-y5r}...{down}z5l
  652.  ...z6l{z7r-z5l}...{down}z7l{4(x7r-x7l),y7r-y7l}...{up}z7r
  653.  ...z6r{z5l-z7l}...{up}cycle; % short diagonal
  654. pos8(cap_hair,0); pos9(cap_hair,0); z8=z6; x9=x8-.75u; z9=whatever[z2,z3];
  655. filldraw stroke z8e{down}..{down}z9e;  % right stem
  656. pos10(cap_hair,-30); pos11(stem,0);
  657. pos12(cap_curve,0); pos13(cap_curve,0); pos14(vair,90);
  658. lft x11l=hround 1.5u; x10=x12=.4[x11,.5w]; z10=whatever[z2,z3];
  659. lft x13l=hround u; z13l=z14l; y11=.5y10; y12=.2[y14r,y11]; bot y13=0;
  660. filldraw stroke z10e{2(x11-x10),y11-y10}
  661.  ...z11e{down}..{down}z12e; % left stem
  662. filldraw z12r{down}...z13r---z13l--z14r{right}...{up}z12l--cycle; % flourish
  663. penlabels(1,2,3,4,5,6,7,8,9,10,11,12,13,14); endchar;
  664.  
  665. cmchar "Multiset union sign";
  666. beginchar(oct"135",12u#,.8asc_height#,0); autorounded;
  667. adjust_fit(if monospace:-.5u#,-.5u# else: 0,0 fi); pickup rule.nib;
  668. lft x1=hround u; x2=x1; x3=w-x3; x4=x5=w-x1;
  669. y1=good.y h+o; bot y3=-o; y2=y4=2/3[y1,y3]; y5=y1;
  670. draw z1---z2...z3...z4---z5;  % stems and cup
  671. y8=y9=.47[y1,y3]; x8=w-x9=x1+2rule_thickness+eps;
  672. x6=x7=x3; .5[y6,y7]=y8; y7-y6=x9-x8;
  673. draw z8--z9; draw z6--z7;  % enclosed plus sign
  674. labels(1,2,3,4,5,6,7,8,9); endchar;
  675.  
  676. cmchar "Left turnstile";
  677. beginchar(oct"140",11u#,asc_height#,0);
  678. adjust_fit(0,0); pickup rule.nib;
  679. .5[y1,y2]=y3=y4; x1=x2=x3;
  680. lft x3=hround u; x4=w-x3; top y1=h; bot y2=0;
  681. draw z1--z2;  % stem
  682. draw z3--z4;  % bar
  683. labels(1,2,3,4); endchar;
  684.  
  685. cmchar "Right turnstile";
  686. beginchar(oct"141",11u#,asc_height#,0);
  687. adjust_fit(0,0); pickup rule.nib;
  688. .5[y1,y2]=y3=y4; x1=x2=x4;
  689. lft x3=hround u; x4=w-x3; top y1=h; bot y2=0;
  690. draw z1--z2;  % stem
  691. draw z3--z4;  % bar
  692. labels(1,2,3,4); endchar;
  693.  
  694. cmchar "Left floor bracket";
  695. beginchar(oct"142",8u#,body_height#,paren_depth#);
  696. adjust_fit(0,0); pickup rule.nib;
  697. x1=x2=good.x 3.5u; x3=x1+3.75u+eps;
  698. top y1=h; .5[y1,y2]=math_axis; y3=y2;
  699. draw z1--z2--z3;  % stem and bar
  700. labels(1,2,3); endchar;
  701.  
  702. cmchar "Right floor bracket";
  703. beginchar(oct"143",8u#,body_height#,paren_depth#);
  704. adjust_fit(0,0); pickup rule.nib;
  705. x1=x2=good.x(w-3.5u); x3=x1-3.75u-eps;
  706. top y1=h; .5[y1,y2]=math_axis; y3=y2;
  707. draw z1--z2--z3;  % stem and bar
  708. labels(1,2,3); endchar;
  709.  
  710. cmchar "Left ceiling bracket";
  711. beginchar(oct"144",8u#,body_height#,paren_depth#);
  712. adjust_fit(0,0); pickup rule.nib;
  713. x1=x2=good.x 3.5u; x3=x1+3.75u+eps;
  714. top y1=h; .5[y1,y2]=math_axis; y3=y1;
  715. draw z3--z1--z2;  % stem and bar
  716. labels(1,2,3); endchar;
  717.  
  718. cmchar "Right ceiling bracket";
  719. beginchar(oct"145",8u#,body_height#,paren_depth#);
  720. adjust_fit(0,0); pickup rule.nib;
  721. x1=x2=good.x(w-3.5u); x3=x1-3.75u-eps;
  722. top y1=h; .5[y1,y2]=math_axis; y3=y1;
  723. draw z3--z1--z2;  % stem and bar
  724. labels(1,2,3); endchar;
  725.  
  726. cmchar "Left angle bracket";
  727. beginchar(oct"150",7u#,body_height#,paren_depth#);
  728. adjust_fit(0,0); pickup rule.nib;
  729. rt x1=hround(w-u)+eps; x1=x3; lft x2=hround 2u-1-eps;
  730. top y1=h+eps; .5[y1,y3]=y2=math_axis;
  731. draw z1--z2--z3;  % diagonals
  732. labels(1,2,3); endchar;
  733.  
  734. cmchar "Right angle bracket";
  735. beginchar(oct"151",7u#,body_height#,paren_depth#);
  736. adjust_fit(0,0); pickup rule.nib;
  737. rt(w-x1)=hround(w-u)+eps; x1=x3; lft(w-x2)=hround 2u-1-eps;
  738. top y1=h+eps; .5[y1,y3]=y2=math_axis;
  739. draw z1--z2--z3;  % diagonals
  740. labels(1,2,3); endchar;
  741.  
  742. cmchar "Double vertical line (norm or cardinality)";
  743. beginchar(oct"153",9u#,body_height#,paren_depth#);
  744. adjust_fit(0,0); pickup rule.nib;
  745. x1=x2; top y1=h; .5[y1,y2]=math_axis;
  746. x3=x4=w-x1; y3=y1; y4=y2;
  747. compute_spread(.45x_height#,.55x_height#); x3-x1=spread;
  748. draw z1--z2; draw z3--z4;  % stems
  749. labels(1,2,3,4); endchar;
  750.  
  751. cmchar "Up-and-down arrow";
  752. beginchar(oct"154",9u#,body_height#,paren_depth#);
  753. adjust_fit(0,0); pickup crisp.nib;
  754. pos1(rule_thickness,0); pos2(rule_thickness,0);
  755. pos3(rule_thickness,90); pos4(rule_thickness,90);
  756. lft x1l=hround(.5w-.5rule_thickness); y1=.5[-d,h];
  757. x0=x1=x2; bot y0=-d-o; x0-x3=x4-x0=4u+eps;
  758. y3=y4=y0+.36asc_height+eps;
  759. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  760. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  761. z9=.2[.5[z3,z4],z0];
  762. numeric t; path p; p=z4r{z9-z4}..z6r;
  763. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  764. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  765.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  766.  --z3l{z9-z3}..z0 & cycle;  % lower arrowhead and stem
  767. pos11(rule_thickness,0); pos12(rule_thickness,0); z11=z1;
  768. pos13(rule_thickness,90); pos14(rule_thickness,90);
  769. x10=x11=x12; top y10=h+o; x10-x13=x14-x10=4u+eps;
  770. y13=y14=y10-.36asc_height-eps;
  771. pos15(rule_thickness,angle(z14-z10)); z15l=z10;
  772. pos16(rule_thickness,angle(z13-z10)); z16l=z10;
  773. z19=.2[.5[z13,z14],z10];
  774. numeric t; path p; p=z14l{z19-z14}..z16r;
  775. t=xpart(p intersectiontimes((x12r,-d)--(x12r,h))); y12=ypart point t of p;
  776. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  777.  --z12r---z11r..z11l---z12l--subpath (t,0) of\\(z13l{z19-z13}..z15r)
  778.  --z13r{z19-z13}..z10 & cycle;  % upper arrowhead and stem
  779. penlabels(0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,19); endchar;
  780.  
  781. cmchar "Double up-and-down arrow";
  782. beginchar(oct"155",11u#,body_height#,paren_depth#);
  783. adjust_fit(0,0); pickup rule.nib;
  784. compute_spread(.45x_height#,.55x_height#);
  785. bot y1=bot y2=-d-eps; top y7=h; y8=y7;
  786. x1=x7; x2=x8; x1-x2=spread; .5[x1,x2]=crisp.lft hround(crisp.rt .5w);
  787. draw z1--z7; draw z2--z8;  % bars
  788. pickup crisp.nib; top y0=h+o; x0=good.x .5w;
  789. pos3(rule_thickness,90); pos4(rule_thickness,90);
  790. x2-x3=x4-x1=3u+eps; y3=y4=y0-.4asc_height-eps;
  791. pos5(rule_thickness,angle(z4-z0)); z5l=z0;
  792. pos6(rule_thickness,angle(z3-z0)); z6l=z0;
  793. z9=.381966[.5[z3,z4],z0];
  794. erase filldraw z0..{z3-z9}z3--(x3,h)
  795.  --(x4,h)--z4{z9-z4}..z0 & cycle;  % erase excess at top
  796. numeric t; path p; p=z4l{z9-z4}..z6r;
  797. t=xpart(p intersectiontimes((x0,-d)--(x0,h)));
  798. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  799.  --subpath (t,0) of\\(z3l{z9-z3}..z5r)
  800.  --z3r{z9-z3}..z0 & cycle;  % top arrowhead
  801. bot y10=-d-o; x10=good.x .5w;
  802. pos13(rule_thickness,90); pos14(rule_thickness,90);
  803. x13=x3; x14=x4; y13=y14=y10+.4asc_height-eps;
  804. pos15(rule_thickness,angle(z14-z10)); z15l=z10;
  805. pos16(rule_thickness,angle(z13-z10)); z16l=z10;
  806. z19=.381966[.5[z13,z14],z10];
  807. erase filldraw z10..{z13-z19}z13--(x13,-d)
  808.  --(x14,-d)--z14{z19-z14}..z10 & cycle;  % erase excess at bottom
  809. numeric t; path p; p=z14r{z19-z14}..z16r;
  810. t=xpart(p intersectiontimes((x10,-d)--(x10,h)));
  811. filldraw z10..{z14-z19}z14l--subpath (0,t) of\\(z14r{z19-z14}..z16r)
  812.  --subpath (t,0) of\\(z13r{z19-z13}..z15r)
  813.  --z13l{z19-z13}..z10 & cycle;  % bottom arrowhead
  814. penlabels(0,1,2,3,4,5,6,7,8,9,13,14,15,16,19); endchar;
  815.  
  816. cmchar "Wreath product";
  817. beginchar(oct"157",5u#,asc_height#,asc_depth#);
  818. adjust_fit(if monospace: u#,u# else: 0,0 fi);
  819. pickup pencircle yscaled .7rule_thickness xscaled 1.4rule_thickness;
  820. if vair#>.8curve#: pickup rule.nib; autorounded; fi % monoline
  821. lft x1=lft x3=hround u; x2=x4=w-x1;
  822. top y1=vround .75[math_axis,h];
  823. .5[y1,y4]=.5[y2,y3]=math_axis; y1-y2=1/4(y1-y4);
  824. draw z1{right}...z2{down}..{down}z3...{right}z4;  % stroke
  825. labels(1,2,3,4); endchar;
  826.  
  827. cmchar "Radical sign";
  828. beginchar(oct"160",15u#,rule_thickness#,
  829.  body_height#+paren_depth#-rule_thickness#);
  830. big_sqrt; endchar;
  831.  
  832. cmchar "Amalgamation symbol or coproduct symbol";
  833. beginchar(oct"161",13u#+width_adj#,cap_height#,0);
  834. italcorr cap_height#*slant-cap_serif_fit#+cap_jut#-2.5u#+min(.5cap_stem#,u#);
  835. adjust_fit(cap_serif_fit#,cap_serif_fit#);
  836. pickup tiny.nib; pos1(cap_stem,0); pos2(cap_stem,0);
  837. pos3(cap_stem,0); pos4(cap_stem,0);
  838. lft x1l=lft x2l=hround max(2u,3u-.5cap_stem); x3=x4=w-x1;
  839. top y1=top y3=h; bot y2=bot y4=0;
  840. filldraw stroke z1e--z2e; % left stem
  841. filldraw stroke z3e--z4e; % right stem
  842. penpos5(cap_bar,90); penpos6(cap_bar,90);
  843. x5=x1; x6=x3; y5=y6; y5l=0;
  844. fill stroke z5e--z6e;  % bar
  845. if serifs: numeric inner_jut;
  846.  if rt x1r+cap_jut+u+2<=lft x3l-cap_jut: inner_jut=cap_jut;
  847.  else: rt x1r+inner_jut+u+2=lft x3l-inner_jut; fi
  848.  dish_serif(1,2,a,1/3,cap_jut,b,1/3,inner_jut);  % upper left serif
  849.  nodish_serif(2,1,c,1/3,cap_jut,d,1/3,eps); % lower left serif
  850.  dish_serif(3,4,e,1/3,inner_jut,f,1/3,cap_jut);  % upper right serif
  851.  nodish_serif(4,3,g,1/3,eps,h,1/3,cap_jut); fi  % lower right serif
  852. math_fit(0,.5ic#); penlabels(1,2,3,4,5,6); endchar;
  853.  
  854. cmchar "Nabla or backwards-difference operator";
  855. beginchar(oct"162",15u#,cap_height#,0);
  856. adjust_fit(0,0);
  857. numeric right_stem,alpha;
  858. right_stem=cap_hair if hefty: -3stem_corr fi;
  859. x1l=w-x4r=.75u; y1=y4=h;
  860. x2-x1=x4-x3; x3l=x2l+apex_corr; y2=y3=-apex_o-apex_oo;
  861. alpha=diag_ratio(2,right_stem,y1-y2,x4r-x1l-apex_corr);
  862. penpos1(alpha*cap_stem,0); penpos2(alpha*cap_stem,0);
  863. penpos3(alpha*right_stem,0); penpos4(alpha*right_stem,0);
  864. fill diag_end(2l,1l,1,1,4r,3r)--diag_end(4r,3r,1,1,2l,1l)--cycle;  % triangle
  865. z0=whatever[z1r,z2r]=whatever[z3l,z4l];
  866. y5=y6=h-cap_vstem; z5=whatever[z1r,z2r]; z6=whatever[z3l,z4l];
  867. if y0>cap_notch_cut: y0:=cap_notch_cut;
  868.  unfill z0+.5right{up}...{z4-z3}z6--z5{z2-z1}
  869.   ...{down}z0+.5left--cycle; % counter
  870. else: unfill z0--z5--z6--cycle; fi  % counter
  871. penlabels(0,1,2,3,4,5,6); endchar;
  872.  
  873. cmchar "Square set union sign (Scott lub)";
  874. beginchar(oct"164",12u#,.8asc_height#,0);
  875. adjust_fit(0,0); pickup rule.nib;
  876. lft x1=hround 1.1u; x2=x1; x4=x5=w-x1;
  877. y1=good.y h+o; bot y2=0; y4=y2; y5=y1;
  878. draw z1---z2---z4---z5;  % stems and bar
  879. labels(1,2,4,5); endchar;
  880.  
  881. cmchar "Square set intersection sign (Scott glb)";
  882. beginchar(oct"165",12u#,.8asc_height#,0);
  883. adjust_fit(0,0); pickup rule.nib;
  884. lft x1=hround 1.1u; x2=x1; x4=x5=w-x1;
  885. y2=good.y h+o; bot y1=0; y4=y2; y5=y1;
  886. draw z1---z2---z4---z5;  % stems and bar
  887. labels(1,2,4,5); endchar;
  888.  
  889. cmchar "Square subset or equal to sign";
  890. compute_spread(.45x_height#,.55x_height#);
  891. spread#':=spread#; spread':=spread; % the spread of `$=$'
  892. compute_spread(5/4x_height#,3/2x_height#);
  893. beginchar(oct"166",14u#,v_center(spread#'+spread#+rule_thickness#));
  894. adjust_fit(0,0); pickup rule.nib;
  895. lft x2=hround(1.5u+oo); x1=x4=hround(w-1.5u)+eps; x3=x2;
  896. y1-y4=spread; y2=y1; y3=y4; top y1=h;
  897. draw z1--z2--z3--z4;  % bars and stem
  898. x8=x1; x9=x2-oo-eps; y8=y9; y4-y9=spread';
  899. draw z8--z9;  % lower bar
  900. labels(1,2,3,4,8,9); endchar;
  901.  
  902. cmchar "Square superset or equal to sign";
  903. compute_spread(.45x_height#,.55x_height#);
  904. spread#':=spread#; spread':=spread; % the spread of `$=$'
  905. compute_spread(5/4x_height#,3/2x_height#);
  906. beginchar(oct"167",14u#,v_center(spread#'+spread#+rule_thickness#));
  907. adjust_fit(0,0); pickup rule.nib;
  908. x1=x4=hround 1.5u-eps; rt x2=hround(w-1.5u-oo); x3=x2;
  909. y1-y4=spread; y2=y1; y3=y4; top y1=h;
  910. draw z1--z2--z3--z4;  % bars and stem
  911. x8=x1; x9=x2+oo+eps; y8=y9; y4-y9=spread';
  912. draw z8--z9;  % lower bar
  913. labels(1,2,3,4,8,9); endchar;
  914.  
  915. cmchar "Section sign";
  916. beginchar(oct"170",6.5u#+max(1.5u#,stem#),asc_height#,desc_depth#);
  917. adjust_fit(0,0); pickup fine.nib;
  918. numeric sstem; sstem=hround .75[hair,stem];
  919. pos0(stem,0); pos1(hair,0); pos2(vair,90); pos3(sstem,180); pos4(vair,270);
  920. pos5'(sstem,0); pos5(sstem,180);
  921. pos6(vair,90); pos7(sstem,0); pos8(vair,-90); pos9(hair,-180); pos10(stem,-180);
  922. top y2r=h+oo; bot y8r=-d-oo; y2-y1=y9-y8=(y2-y8)/8;
  923. y3=.52[y4,y2]; y5=.52[y4,y6]; y7=.52[y6,y8]; y5'=.52[y6,y4];
  924. y2-y4=y4-y6=y6-y8;
  925. rt x1r=hround(w-1.5u); lft x3r=hround 1.25u;
  926. x2=x4=x6=x8=.5w; x5=x7=w-x3; x5'=x3; x9=w-x1;
  927. bulb(2,1,0); bulb(8,9,10);  % bulbs
  928. filldraw stroke z2e{left}...z3e{down}...z4e{3(x5-x3),y5-y3}
  929.  ...z5e{down}...{left}z6e;  % upper stroke
  930. filldraw stroke z4e{left}...z5'e{down}...z6e{3(x7-x5'),y7-y5'}
  931.  ...z7e{down}...{left}z8e;  % upper stroke
  932. penlabels(0,1,2,3,4,5,6,7,8,9,10); endchar;
  933.  
  934. cmchar "Dagger mark";
  935. beginchar(oct"171",8u#,asc_height#,desc_depth#);
  936. adjust_fit(0,0); pickup fine.nib;
  937. pos1(stem,0); pos2(thin_join,0); pos3(stem,0); pos4(hair,0);
  938. pos5(stem,90); pos2'(thin_join,90); pos6(stem,90); z2'=z2;
  939. x1=x2=x3=x4; x1-.5stem=hround(.5w-.5stem); center_on(x1);
  940. x5-.5stem=hround u; x6=w-x5;
  941. y1+.5stem=h+oo; y2=y5=y6; y3=.57y2; bot y4=-d-o;
  942. y5+.5stem=floor(x_height+.5stem);
  943. filldraw circ_stroke z1e{down}..z2e{down}..z3e{down}..z4e;  % stem
  944. filldraw circ_stroke z5e{right}..{right}z2'e;  % left bulb
  945. filldraw circ_stroke z6e{left}..{left}z2'e;  % right bulb
  946. penlabels(1,2,3,4,5,6); endchar;
  947.  
  948. cmchar "Double dagger mark";
  949. beginchar(oct"172",8u#,asc_height#,desc_depth#);
  950. adjust_fit(0,0); pickup fine.nib;
  951. pos1(stem,0); pos2(thin_join,0); pos3(stem,0);
  952. pos4(stem,90); pos2'(thin_join,90); pos5(stem,90); z2'=z2;
  953. x1=x2=x3; x1-.5stem=hround(.5w-.5stem); center_on(x1);
  954. x4-.5stem=hround u; x5=w-x4;
  955. y1+.5stem=h+oo; y2=y4=y5=.5[y1,y3]; y3-.5stem=ceiling(.5[-d,h]);
  956. filldraw circ_stroke z1e{down}..{down}z2e;  % top stem
  957. filldraw circ_stroke z3e{up}..{up}z2e;    % upper middle stem
  958. filldraw circ_stroke z4e{right}..{right}z2'e;  % top left bulb
  959. filldraw circ_stroke z5e{left}..{left}z2'e;  % top right bulb
  960. pos6(stem,0); pos7(thin_join,0); pos8(stem,0);
  961. pos9(stem,90); pos7'(thin_join,90); pos0(stem,90); z7'=z7;
  962. x6=x7=x8=x1; x9=x4; x0=x5;
  963. y6=y3-stem-1; y7=y9=y0=.5[y6,y8]; y8-.5stem=-d-oo;
  964. filldraw circ_stroke z6e{down}..{down}z7e;  % lower middle stem
  965. filldraw circ_stroke z8e{up}..{up}z7e;    % bottom stem
  966. filldraw circ_stroke z9e{right}..{right}z7'e;  % bottom left bulb
  967. filldraw circ_stroke z0e{left}..{left}z7'e;  % bottom right bulb
  968. penlabels(1,2,3,4,5,6,7,8,9,0); endchar;
  969.  
  970. cmchar "Paragraph mark";
  971. beginchar(oct"173",11u#,asc_height#,desc_depth#);
  972. adjust_fit(0,0); pickup rule.nib; autorounded;
  973. top y1=h; bot y6=-d-eps; y4=y7=y9=y1;
  974. y8=y6; y3=y5=good.y .5[y1,y6];
  975. x7-x4=ceiling(rule_thickness+1.25u);
  976. lft x2=hround u; y2=.5[y1,y3]; x4=x5=x6; rt x9=hround(w-.5u);
  977. x7=x8=good.x(x9-1.5u); x1=x3=min(.5w,x4);
  978. filldraw z4..z1{left}...z2{down}...{right}z5--cycle;  % filled bowl
  979. draw z9--z4--z6;  % left stem and upper serif
  980. draw z7--z8;  % right stem
  981. labels(1,2,3,4,5,6,7,8,9); endchar;
  982.  
  983. cmchar "Club suit";
  984. beginchar(oct"174",14u#,asc_height#,2/3desc_depth#);
  985. adjust_fit(0,0); pickup rule.nib; autorounded;
  986. x1=x4=x30=x33=good.x .5w; center_on(x1);
  987. x2=good.x(x1-.5u)-eps; lft x1-rt x10=hround .5pt; lft x12=hround .5u;
  988. x11=.6[x12,x10]; x13=.5[x12,x10]=x5; x32-x31=x1-.5u-x12;
  989. x2+x3=x5+x6=x10+x20=x11+x21=x12+x22=x13+x23=x31+x32=2x1;
  990. top y30=h+o+oo; bot y11=bot y21=-o; top y13=top y23=vround .53h;
  991. y30-y33=y13-y11; y31=y32=y4=.5[y30,y33]; y12=y22=.5[y11,y13];
  992. y1=y10=y20=good.y .1h; bot y5=bot y6=y1+.75; bot y2=bot y3=-d;
  993. filldraw z30{left}...z31{down}...z33{right}...z32{up}...cycle;  % top bowl
  994. filldraw z13{left}...z12{down}...z11{right}...z10{up}...cycle;  % left bowl
  995. filldraw z23{left}...z20{down}...z21{right}...z22{up}...cycle;  % right bowl
  996. filldraw z1{down}...{2(x2-x1),y2-y1}z2--z3{2(x1-x3),y1-y3}
  997.  ...{up}cycle;  % stem
  998. filldraw z4--z5--z6--cycle;  % filling
  999. labels(1,2,3,4,5,6,10,11,12,13,20,21,22,23,30,31,32,33); endchar;
  1000.  
  1001. cmchar "Diamond suit";
  1002. beginchar(oct"175",14u#,asc_height#,2/3desc_depth#);
  1003. adjust_fit(0,0); pickup rule.nib; autorounded;
  1004. x1=x4=good.x .5w; center_on(x1);
  1005. lft x2=hround u; x3=w-x2;
  1006. top y1=h+o+oo; bot y4=-d-o-oo; y2=y3=.5[y1,y4];
  1007. draw z1{x3-x1,1.5(y3-y1)}...z3{1.5(x3-x1),y3-y1};  % upper right diagonal
  1008. draw z1{x2-x1,1.5(y2-y1)}...z2{1.5(x2-x1),y2-y1};  % upper left diagonal
  1009. draw z4{x2-x4,1.5(y2-y4)}...z2{1.5(x2-x4),y2-y4};  % lower left diagonal
  1010. draw z4{x3-x4,1.5(y3-y4)}...z3{1.5(x3-x4),y3-y4};  % lower right diagonal
  1011. labels(1,2,3,4); endchar;
  1012.  
  1013. cmchar "Heart suit";
  1014. beginchar(oct"176",14u#,asc_height#,2/3desc_depth#);
  1015. adjust_fit(0,0); pickup rule.nib; autorounded;
  1016. x1=x5=good.x .5w; center_on(x1);
  1017. lft x7=hround u; x8=4u; x2+x8=x3+x7=x4+x6=w;
  1018. y1=good.y .77h; top y2=h+o; y3=.7h; y4=.2h; bot y5=-o-oo;
  1019. y2=y8; y3=y7; y4=y6; z4=whatever[z3,z5];
  1020. x0=x9=w; y0=1.5h; y9=.6h;
  1021. draw z1{x2-x1,8(y2-y1)}...z2{right}....z3{down}...{z4-z9}z4
  1022.  ...{z5-z0}z5;  % right half bowl
  1023. draw z1{x8-x1,8(y8-y1)}...z8{left}....z7{down}...{(z4-z9)xscaled-1}z6
  1024.  ...{(z5-z0)xscaled-1}z5;  % left half bowl
  1025. labels(0,1,2,3,4,5,6,7,8,9); endchar;
  1026.  
  1027. cmchar "Spade suit";
  1028. beginchar(oct"177",14u#,asc_height#,2/3desc_depth#);
  1029. adjust_fit(0,0); pickup rule.nib; autorounded;
  1030. x1=x10=good.x .5w; center_on(x1);
  1031. x2=good.x(x1-.5u)-eps; lft x1-rt x6=hround .5pt; x5=x6;
  1032. x7=.5[x8,x6]; lft x8=hround u;
  1033. x2+x3=x5+x15=x6+x14=x7+x13=x8+x12=x9+x11=2x10;
  1034. top y10=h+o+oo; y9=y11=.7h; y8=y12=.3h;
  1035. y1=y6=y14=good.y .1h; bot y5=bot y15=y1+.75;
  1036. bot y7=bot y13=-o; bot y2=bot y3=-d; z9=whatever[z8,z10];
  1037. filldraw z10{-w,-3h}...z9{-w,-h}...z8{down}...z7{right}...z6---z5
  1038.  --z15---z14...{right}z13...{up}z12...{-w,h}z11
  1039.  ...{-w,3h}cycle;  % filled bowl
  1040. filldraw z1{down}...{2(x2-x1),y2-y1}z2--z3{2(x1-x3),y1-y3}
  1041.  ...{up}cycle;  % stem
  1042. labels(1,2,3,5,6,10,11,12,13,14,15); endchar;
  1043.